#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#define dev "/dev/fgpio"


typedef enum
{
	DC_GP_A0,
	DC_GP_A1,
	DC_GP_A2,
	DC_GP_A3,
	DC_GP_A4,
	DC_GP_A5,
	DC_GP_A6,
	DC_GP_A7,
	DC_GP_B0,
	DC_GP_B1,
	DC_GP_B2,
	DC_GP_B3,
	DC_GP_B4,
	DC_GP_B5,
	DC_GP_B6,
	DC_GP_B7,
	DC_GP_C0,
	DC_GP_C1,
	DC_GP_C2,
	DC_GP_C3,
	DC_GP_C4,
	DC_GP_C5,
	DC_GP_C6,
	DC_GP_C7,
	DC_GP_D0,
	DC_GP_D1,
	DC_GP_D2,
	DC_GP_D3,
	DC_GP_D4,
	DC_GP_D5,
	DC_GP_D6,
	DC_GP_D7,
	DC_GP_E0,
	DC_GP_E1,
	DC_GP_E2,
	DC_GP_E3,
	DC_GP_E4,
	DC_GP_E5,
	DC_GP_E6,
	DC_GP_E7,
	DC_GP_F0,
	DC_GP_F1,
	DC_GP_F2,
	DC_GP_F3,
	DC_GP_F4,
	DC_GP_F5,
	DC_GP_F6,
	DC_GP_F7,
	DC_GP_G0,
	DC_GP_G1,
	DC_GP_G2,
	DC_GP_G3,
	DC_GP_G4,
	DC_GP_G5,
	DC_GP_G6,
	DC_GP_G7,
	DC_GP_H0,
	DC_GP_H1,
	DC_GP_H2,
	DC_GP_H3,
	DC_GP_H4,
	DC_GP_H5,
	DC_GP_H6,
	DC_GP_H7,
	DC_GP_I0,
	DC_GP_I1,
	DC_GP_I2,
	DC_GP_I3,
	DC_GP_I4,
	DC_GP_I5,
	DC_GP_I6,
	DC_GP_I7,
	DC_GP_J0,
	DC_GP_J1,
	DC_GP_J2,
	DC_GP_J3,
	DC_GP_J4,
	DC_GP_J5,
	DC_GP_J6,
	DC_GP_J7,
	DC_GP_K0,
	DC_GP_K1,
	DC_GP_K2,
	DC_GP_K3,
	DC_GP_K4,
	DC_GP_K5,
	DC_GP_K6,
	DC_GP_K7,
	DC_GP_L0,
	DC_GP_L1,
	DC_GP_L2,
	DC_GP_L3,
	DC_GP_L4,
	DC_GP_L5,
	DC_GP_L6,
	DC_GP_L7,
	DC_GP_M0,
	DC_GP_M1,
	DC_GP_M2,
	DC_GP_M3,
	DC_GP_M4,
	DC_GP_M5,
	DC_GP_M6,
	DC_GP_M7,
	DC_GP_N0,
	DC_GP_N1,
	DC_GP_N2,
	DC_GP_N3,
	DC_GP_N4,
	DC_GP_N5,
	DC_GP_N6,
	DC_GP_N7,
	DC_GP_O0,
	DC_GP_O1,
	DC_GP_O2,
	DC_GP_O3,
	DC_GP_O4,
	DC_GP_O5,
	DC_GP_O6,
	DC_GP_O7,
	DC_GP_P0,
	DC_GP_P1,
	DC_GP_P2,
	DC_GP_P3,
	DC_GP_P4,
	DC_GP_P5,
	DC_GP_P6,
	DC_GP_P7,
	DC_GP_Q0,
	DC_GP_Q1,
	DC_GP_Q2,
	DC_GP_Q3,
	DC_GP_Q4,
	DC_GP_Q5,
	DC_GP_Q6,
	DC_GP_Q7,
	DC_GP_R0,
	DC_GP_R1,
	DC_GP_R2,
	DC_GP_R3,
	DC_GP_R4,
	DC_GP_R5,
	DC_GP_R6,
	DC_GP_R7,
	DC_GP_S0,
	DC_GP_S1,
	DC_GP_S2,
	DC_GP_S3,
	DC_GP_S4,
	DC_GP_S5,
	DC_GP_S6,
	DC_GP_S7,
	DC_GP_T0,
	DC_GP_T1,
	DC_GP_T2,
	DC_GP_T3,
	DC_GP_T4,
	DC_GP_T5,
	DC_GP_T6,
	DC_GP_T7,
	DC_GP_INVALID = -1
} DC_GP_NUM;

typedef struct
{
	DC_GP_NUM gp_num;
	int gp_level;
}gpio_params;

gpio_params gpio_s;

#define IOC_MAGIC_G	'g'

#define IOCTL_SET_GPIO_OUTPUT_HI 		_IOWR(IOC_MAGIC_G,1,gpio_params)
#define IOCTL_SET_GPIO_OUTPUT_LO		_IOWR(IOC_MAGIC_G,2,gpio_params)
#define IOCTL_GET_GPIO_INPUT_LEVEL		_IOWR(IOC_MAGIC_G,3,gpio_params)


int main(int argc,char** argv)
{
	int fd = -1;
	
	fd = open(dev,O_RDWR);
	if(fd < 0)
	{
		printf("open error!\n");
		return -1;
	}
	
	//gpio_s.gp_num = DC_GP_J1;
	//gpio_s.gp_level = 0;

	
	//ioctl(fd,IOCTL_SET_GPIO_OUTPUT_LO,&gpio_s);
	//gpio_s.gp_num = DC_GP_O2;
	//gpio_s.gp_level = 0;

	//ioctl(fd,IOCTL_SET_GPIO_OUTPUT_HI,&gpio_s);
	gpio_s.gp_num = DC_GP_I1;
	gpio_s.gp_level = 0;
	ioctl(fd,IOCTL_GET_GPIO_INPUT_LEVEL,&gpio_s);
	printf("DC_GP_I0 level is %d\n",gpio_s.gp_level);
	
	return 0;
}
